package shop.controller;


import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import shop.model.Product;
import shop.util.HibernateUtil;


public class HibernateManager extends HibernateUtil {
 
	   protected Object myClass = new Object(); // tipo de objeto  
	   protected String TABLE = ""; // nombre de la tabla  
	 
	   	 
	 
	   public Object getElementById(Long id){  
	       Object obj = new Object();  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // cargar objeto por clave  
	           obj = session.createCriteria(myClass.getClass()).add(Restrictions.eq("id", id)).uniqueResult();  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en getElementById: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	       }  
	       return obj;  
	   }  
	 
	  
	   
	   public boolean add(Object o) {  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // almacenarlo  
	           session.save(o);  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en create: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	           return false;  
	       }  
	       return true;  
	   }  
	 
	  
	   
	   public boolean update(Object o){  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // actualizarlo  
	           session.saveOrUpdate(o);  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en update: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	           return false;  
	       }  
	       return true;  
	   }  
	 
	   
	   
	   
	   public boolean delete(Object o) {  
	       if(o == null){  
	           return false;  
	       }  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // borrarlo  
	           session.delete(o);  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en delete: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	           return false;  
	       }  
	       return true;  
	   }  
	 
	  
	   
	   public List getList(){  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       List result = new ArrayList();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // obtener la lista de eventos  
	           result = session.createCriteria(myClass.getClass()).list();  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en getList: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	       }  
	       return result;  
	   }  
	 
	 
	   
	   public List getSubList(int ini, int batch){  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       List result = new ArrayList();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // obtener la lista de eventos  
	           List aux = session.createCriteria(myClass.getClass()).list();  
	           for(int i = ini; i < aux.size() && i < ini + batch; i++){  
	               result.add(aux.get(i));  
	           }  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en getSubList: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	       }  
	       return result;  
	   }  
	 
	   
	   
	   public int getListCount() {  
	       Number count = 0;  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // obtener la cantidad  
	           count = (Number) session.createCriteria(myClass.getClass()).setProjection(Projections.rowCount()).uniqueResult();  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en getListCount: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	       }  
	       return count.intValue();  
	   }  
	 
	   
	   
	   public boolean checkRepeated(String attr, String value){  
	       Object obj = new Object();  
	       // obtener la sesion actual  
	       Session session = getSession();  
	       try {  
	           // comenzar la transaccion  
	           session.beginTransaction();  
	           // cargar objeto por clave  
	           obj = session.createCriteria(myClass.getClass()).add(Restrictions.eq(attr, value)).uniqueResult();  
	           // confirmar transaccion  
	           session.getTransaction().commit();  
	       } catch (Exception e) {  
	           System.out.println("Error en checkRepeated: " + e);  
	           // deshacer transaccion  
	           this.rollback();  
	       }  
	       return obj != null ? true : false;  
	   }  
	 
	   
	   
	   protected Session getSession(){  
	       Session session = null;  
	       try {  
	           session = HibernateUtil.getSessionFactory().getCurrentSession();  
	           if(!session.isOpen()){  
	               session = HibernateUtil.getSessionFactory().openSession();  
	           }  
	       } catch(Exception e){  
	           session = HibernateUtil.getSessionFactory().openSession();  
	       }  
	       return session;  
	   }  
	 


	   
	   public String getTableName(){  
	       return TABLE;  
	   }  
	 
	   
	   
	   public void rollback(){  
	       Session session = getSession();  
	       try {  
	           // deshacer transaccion  
	           session.getTransaction().rollback();  
	       } catch (Exception e) {  
	           System.out.println("Error en rollback: " + e);  
	       }  
	   }  
}
